昨天探討了運用分組與多選結構,並以IP位址作範例.
但是資料是由人或人設計出來的設備產生的,人類有
喜歡整齊的傾向,所以有時候會遇到一些補滿位數的
情況,例如 6 寫成 006, 37 寫成 037,這樣的格式.
遇到這種情況,昨天的方法,就會把上述的例子過濾掉了.
今天探討改進的方案.
位數 範圍 原正規式 補位 新正規式
1位 0-9 [0-9] (00)可能不出現,出現最多一次 (00)?[0-9]
2位 10-99 [0-9]{2} 0 可能不出現,出現最多一次 0?[0-9]{2}
3位 100-255 不需要 維持不變
分三組
100-199 1[0-9][0-9]
200-249 2[0-4][0-9]
250-255 25[0-5]
所以可以改成
part=r"^((00)?[0-9]|0?[0-9]{2}|1[0-9][0-9]|2[0-4][0-9]|25[0-5])$"
驗證:
In [1]: import re
In [2]: part=r"^((00)?[0-9]|0?[0-9]{2}|1[0-9][0-9]|2[0-4][0-9]|25[0-5])$"
In [3]: re.search(part, "000") != None
Out[3]: True
In [4]: re.search(part, "099") != None
Out[4]: True
In [5]: re.search(part, "168") != None
Out[5]: True
In [6]: re.search(part, "256") != None
Out[6]: False
日期時間格式的判斷,也是容易遇到有人會補0,所以可以用同樣的招數.
月
範圍 1-9月 正規式
1-12 1-9 or 01-09 0?[1-9]
10-12月 1[012]
驗證
In [7]: month=r"^(0?[1-9]|1[012])$"
In [8]: re.search(month, "01") != None
Out[8]: True
In [9]: re.search(month, "9") != None
Out[9]: True
In [10]: re.search(month, "12") != None
Out[10]: True
In [11]: re.search(month, "13") != None
Out[11]: False
日,小時,分鐘也是照同樣要領.
以下是正規式對照
日 (0?[1-9]|[12]\d|3[01]) 分別對應 1-9補或不補0, 10-29, 30-31
小時 (0?[1-9]|1\d|2[0-4]) 分別對應 1-9補或不補0, 10-19, 20-24
分鍾 (0?[1-9]|[1-5]\d|60) 分別對應 1-9補或不補0, 10-59, 60